package com.huida.app.hutoolsusage;

import cn.hutool.core.date.*;
import org.apache.commons.lang3.time.DateUtils;
import org.junit.Test;
import org.springframework.boot.test.context.SpringBootTest;

import java.util.Calendar;

/**
 * @author wangzhuangzhuang
 * @DESC: 日期时间工具
 * @date 2022-01-10 11:20
 *
 *  - DateUtil 针对日期时间操作提供一系列静态方法
 *  - DateTime 提供类似于Joda-Time中日期时间对象封装
 *  - DateBetween 计算两个时间间隔的类，除了通过构造新对象使用外，相关操作也已封装在DateUtil和DateTime的相关方法中。
 *  - TimeInterval 一个简单的计时器类，常用于计算某段代码的执行时间，提供包括毫秒、秒、分、时、天、周等各种单位的花费时长计算，对象的静态构造已封装在DateUtil中。
 *  - DatePattern 提供常用的日期格式化模式，包括String类型和FastDateFormat两种类型。
 */
@SpringBootTest
public class DateOperationUsageDemo {

	// Date、long、Calendar之间的相互转换
	@Test
	public void test01(){
		// 当前时间
		DateTime date = DateUtil.date();
		// 当前时间
		DateTime date1 = DateUtil.date(Calendar.getInstance());
		// 当前时间
		DateTime date2 = DateUtil.date(System.currentTimeMillis());
		// 当前时间字符串，格式：yyyy-MM-dd HH:mm:ss
		String nowDateTime = DateUtil.now();
		// 当前日期字符串，格式：yyyy-MM-dd
		String today = DateUtil.today();
		// nowDateTime: 2022-01-10 13:13:01 today: 2022-01-10
		System.out.println("nowDateTime: " + nowDateTime + " today: " + today);
	}

	// 字符串转日期 (DateUtils.parse方法会自动识别一些常用格式）
	/*
	* yyyy/MM/dd HH:mm:ss
	* yyyy.MM.dd HH:mm:ss
	* yyyy年MM月dd日 HH时mm分ss秒
	* yyyy-MM-dd
	* yyyy/MM/dd
	* yyyy.MM.dd
	* HH:mm:ss
	* HH时mm分ss秒
	* yyyy-MM-dd HH:mm
	* yyyy-MM-dd HH:mm:ss.SSS
	* yyyyMMddHHmmss
	* yyyyMMddHHmmssSSS
	* yyyyMMdd
	* EEE, dd MMM yyyy HH:mm:ss z
	* EEE MMM dd HH:mm:ss zzz yyyy
	* yyyy-MM-dd'T'HH:mm:ss'Z'
	* yyyy-MM-dd'T'HH:mm:ss.SSS'Z'
	* yyyy-MM-dd'T'HH:mm:ssZ
	* yyyy-MM-dd'T'HH:mm:ss.SSSZ
	* */
	@Test
	public void test02(){
		String dateStr = "2017-03-01";
		DateTime parseDate = DateUtil.parse(dateStr);
		System.out.println("parseDate: " + parseDate); // parseDate: 2017-03-01 00:00:00

		String formatDate = DateUtil.format(parseDate, "yyyy/MM/dd");
		System.out.println("formatDate: " + formatDate); // formatDate: 2017/03/01

		String formatDateTime = DateUtil.formatDateTime(parseDate);
		System.out.println("formatDateTime: " + formatDateTime); // formatDateTime: 2017-03-01 00:00:00
		String formatTime = DateUtil.formatTime(parseDate);
		System.out.println("formatTime: " + formatTime); // formatTime: 00:00:00
	}

	// 获取Date对象的某个部分
	@Test
	public void test03(){
		DateTime date = DateUtil.date(); // 当前时间
		// 获得年的部分
		int year = DateUtil.year(date);
		System.out.println("year: " + year); // year: 2022
		// 获得月的部分（从0开始计数）
		int month = DateUtil.month(date);
		System.out.println("month: " + (month + 1)); // month: 1
		// 获得月份枚举
		Month month1 = DateUtil.monthEnum(date);
	}

	// 开始和结束时间
	@Test
	public void test04(){
		String dateStr = "2017-03-01 22:33:23";
		DateTime dateTime = DateUtil.parse(dateStr);

		// 一天的开始 beginOfDay: 2017-03-01 00:00:00
		DateTime beginOfDay = DateUtil.beginOfDay(dateTime);
		System.out.println("beginOfDay: " + beginOfDay);
		// 一天的结束 endOfDay: 2017-03-01 23:59:59
		DateTime endOfDay = DateUtil.endOfDay(dateTime);
		System.out.println("endOfDay: " + endOfDay);
	}

	// 日期时间偏移（日期或时间的偏移指针对某个日期增加或减少分、小时、天等
	@Test
	public void test05(){
		String dateStr = "2017-03-01 22:33:23";
		DateTime dateTime = DateUtil.parse(dateStr);

		// 结果: 2017-03-03 22:33:23
		DateTime newDate01 = DateUtil.offset(dateTime, DateField.DAY_OF_MONTH, 2);

		// 常用偏移，结果：2017-03-04 22:33:23
		DateTime newDate02 = DateUtil.offsetDay(dateTime, 3);

		// 常用偏移，结果：2017-03-01 19:33:23
		DateTime newDate03 = DateUtil.offsetHour(dateTime, -3);

		// newDate01: 2017-03-03 22:33:23 , newDate02: 2017-03-04 22:33:23 , newDate03: 2017-03-01 19:33:23
		System.out.println("newDate01: " + newDate01 + " , newDate02: " + newDate02 + " , newDate03: " + newDate03);
	}

	// 针对当前时间，提供简化的偏移方法（eg: 昨天、上周、上个月等）
	@Test
	public void test06(){
		System.out.println("昨天： " + DateUtil.yesterday()); // 昨天： 2022-01-09 14:09:09

		System.out.println("明天： " + DateUtil.tomorrow()); // 明天： 2022-01-11 14:09:09

		System.out.println("上周： " + DateUtil.lastWeek()); // 上周： 2022-01-03 14:09:09

		System.out.println("下周： " + DateUtil.nextWeek()); // 下周： 2022-01-17 14:09:09

		System.out.println("上个月: " + DateUtil.lastMonth()); // 上个月: 2021-12-10 14:09:09

		System.out.println("下个月: " + DateUtil.nextMonth()); // 下个月: 2022-02-10 14:09:09
	}

	// 日期时间差（计算两个日期之间的时间差（相差天数、相差小时数等）
	@Test
	public void test07(){
		String dateStr01 = "2017-03-01 22:33:23";
		DateTime date01 = DateUtil.parse(dateStr01);

		String dateStr02 = "2017-04-01 23:33:23";
		DateTime date02 = DateUtil.parse(dateStr02);

		long betweenDay = DateUtil.between(date01, date02, DateUnit.DAY); // 相距的天数
		long betweenHour = DateUtil.between(date01, date02, DateUnit.HOUR); // 相差的小时数
		System.out.println("betweenDay: " + betweenDay + " betweenHour: " + betweenHour);
		// betweenDay: 31 betweenHour: 745

		// 格式化时间差 比如XX天XX小时XX分XX秒 使用DateUtil.formatBetween
		// Level.MINUTE表示精确到分
		String formatBetween = DateUtil.formatBetween(betweenDay, BetweenFormatter.Level.MINUTE);
		System.out.println("formatBetween: " + formatBetween);
	}


	// 得到星座和属相
	@Test
	public void test08(){
		String zodiac01 = DateUtil.getZodiac(Month.JANUARY.getValue(), 19);
		String zodiac02 = DateUtil.getZodiac(Month.FEBRUARY.getValue(), 1);
		String zodiac03 = DateUtil.getZodiac(Month.FEBRUARY.getValue(), 18);
		//  zodiac01: 摩羯座 zodiac02: 水瓶座 zodiac03: 水瓶座
		System.out.println(" zodiac01: " + zodiac01 + " zodiac02: " + zodiac02 + " zodiac03: " + zodiac03);

		String chineseZodiac01 = DateUtil.getChineseZodiac(1999);
		String chineseZodiac02 = DateUtil.getChineseZodiac(1998);
		// chineseZodiac01: 兔 chineseZodiac02: 虎
		System.out.println("chineseZodiac01: " + chineseZodiac01 + " chineseZodiac02: " + chineseZodiac02);
	}

	// 得到年龄和是否是闰年
	@Test
	public void test09(){
		// 年龄
		System.out.println(DateUtil.ageOfNow("1998-01-01"));

		// 是否是闰年
		System.out.println(DateUtil.isLeapYear(1999));
	}

	// 日期时间对象 - DateTime



}